package 代码记录.指定公司代码练习记录.华为_2024.分值100;

import java.util.Scanner;

/**
 * @author zx
 * @create 2024-02-02 20:11
 * 二分做法，感觉自己做不出来
 */
public class 孙悟空吃蟠桃_35 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] temp = str.split(" ");
        int[] trees = new int[temp.length];
        for(int i = 0;i < temp.length;i++){
            trees[i] = Integer.parseInt(temp[i]);
        }
        int H = sc.nextInt();
        System.out.println(findOptimalSpeed(trees, H));
    }

    private static int findOptimalSpeed(int[] trees, int h) {
        //判断如果树木数量大于给定的时间限制 h，则无法吃掉所有树木，直接返回速度为 0
        if (trees.length > h) {
            return 0;
        }

        //初始化最小速度为 1，并找出给定树木数组中的最大值作为初始最大速度
        int minSpeed = 1;
        int max = Integer.MIN_VALUE;
        for (int tree : trees) {
            max = Math.max(max, tree);
        }
        int maxSpeed = max;
        int optimalSpeed = maxSpeed;
        //使用二分查找的方式寻找最佳速度，直到最小速度小于等于最大速度
        while (minSpeed <= maxSpeed) {
            int mid = (minSpeed + maxSpeed) / 2;

            if (canEatAll(mid, trees, h)) {
                optimalSpeed = mid;
                maxSpeed = mid - 1;
            } else {
                minSpeed = mid + 1;
            }
        }
        return optimalSpeed;
    }

    /**
     * 计算以给定速度 eatSpeed 吃掉所有树木所需的总时间 hoursNeeded：
     * 返回是否总时间小于等于给定时间 h。
     */
    private static boolean canEatAll(int eatSpeed, int[] trees, int h) {
        int hoursNeeded = 0;
        for (int tree : trees) {
            hoursNeeded += Math.ceil((double) tree / eatSpeed);
        }
        return hoursNeeded <= h;
    }
}
